1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package com.google.common.eventbus.outside;
18
19 import static com.google.common.truth.Truth.assertThat;
20
21 import com.google.common.collect.Lists;
22 import com.google.common.eventbus.EventBus;
23 import com.google.common.eventbus.Subscribe;
24
25 import junit.framework.TestCase;
26
27 import java.util.List;
28
29
30
31
32
33
34
35 public class AnnotatedSubscriberFinderTests {
36
37 private static final Object EVENT = new Object();
38
39 abstract static class AbstractEventBusTest<H> extends TestCase {
40 abstract H createSubscriber();
41
42 private H subscriber;
43
44 H getSubscriber() {
45 return subscriber;
46 }
47
48 @Override
49 protected void setUp() throws Exception {
50 subscriber = createSubscriber();
51 EventBus bus = new EventBus();
52 bus.register(subscriber);
53 bus.post(EVENT);
54 }
55
56 @Override
57 protected void tearDown() throws Exception {
58 subscriber = null;
59 }
60 }
61
62
63
64
65 public static class BaseSubscriberFinderTest extends
66 AbstractEventBusTest<BaseSubscriberFinderTest.Subscriber> {
67 static class Subscriber {
68 final List<Object> nonSubscriberEvents = Lists.newArrayList();
69 final List<Object> subscriberEvents = Lists.newArrayList();
70
71 public void notASubscriber(Object o) {
72 nonSubscriberEvents.add(o);
73 }
74
75 @Subscribe
76 public void subscriber(Object o) {
77 subscriberEvents.add(o);
78 }
79 }
80
81 public void testNonSubscriber() {
82 assertThat(getSubscriber().nonSubscriberEvents).isEmpty();
83 }
84
85 public void testSubscriber() {
86 assertThat(getSubscriber().subscriberEvents).has().item(EVENT);
87 }
88
89 @Override
90 Subscriber createSubscriber() {
91 return new Subscriber();
92 }
93 }
94
95 public static class AnnotatedAndAbstractInSuperclassTest extends
96 AbstractEventBusTest<AnnotatedAndAbstractInSuperclassTest.SubClass> {
97 abstract static class SuperClass {
98 @Subscribe
99 public abstract void overriddenAndAnnotatedInSubclass(Object o);
100
101 @Subscribe
102 public abstract void overriddenInSubclass(Object o);
103 }
104
105 static class SubClass extends SuperClass {
106 final List<Object> overriddenAndAnnotatedInSubclassEvents = Lists.newArrayList();
107 final List<Object> overriddenInSubclassEvents = Lists.newArrayList();
108
109 @Subscribe
110 @Override
111 public void overriddenAndAnnotatedInSubclass(Object o) {
112 overriddenAndAnnotatedInSubclassEvents.add(o);
113 }
114
115 @Override
116 public void overriddenInSubclass(Object o) {
117 overriddenInSubclassEvents.add(o);
118 }
119 }
120
121 public void testOverriddenAndAnnotatedInSubclass() {
122 assertThat(getSubscriber().overriddenAndAnnotatedInSubclassEvents).has().item(EVENT);
123 }
124
125 public void testOverriddenNotAnnotatedInSubclass() {
126 assertThat(getSubscriber().overriddenInSubclassEvents).has().item(EVENT);
127 }
128
129 @Override
130 SubClass createSubscriber() {
131 return new SubClass();
132 }
133 }
134
135 public static class AnnotatedNotAbstractInSuperclassTest extends
136 AbstractEventBusTest<AnnotatedNotAbstractInSuperclassTest.SubClass> {
137 static class SuperClass {
138 final List<Object> notOverriddenInSubclassEvents = Lists.newArrayList();
139 final List<Object> overriddenNotAnnotatedInSubclassEvents = Lists.newArrayList();
140 final List<Object> overriddenAndAnnotatedInSubclassEvents = Lists.newArrayList();
141 final List<Object> differentlyOverriddenNotAnnotatedInSubclassBadEvents = Lists
142 .newArrayList();
143 final List<Object> differentlyOverriddenAnnotatedInSubclassBadEvents = Lists.newArrayList();
144
145 @Subscribe
146 public void notOverriddenInSubclass(Object o) {
147 notOverriddenInSubclassEvents.add(o);
148 }
149
150 @Subscribe
151 public void overriddenNotAnnotatedInSubclass(Object o) {
152 overriddenNotAnnotatedInSubclassEvents.add(o);
153 }
154
155 @Subscribe
156 public void overriddenAndAnnotatedInSubclass(Object o) {
157 overriddenAndAnnotatedInSubclassEvents.add(o);
158 }
159
160 @Subscribe
161 public void differentlyOverriddenNotAnnotatedInSubclass(Object o) {
162
163 differentlyOverriddenNotAnnotatedInSubclassBadEvents.add(o);
164 }
165
166 @Subscribe
167 public void differentlyOverriddenAnnotatedInSubclass(Object o) {
168
169 differentlyOverriddenAnnotatedInSubclassBadEvents.add(o);
170 }
171 }
172
173 static class SubClass extends SuperClass {
174 final List<Object> differentlyOverriddenNotAnnotatedInSubclassGoodEvents = Lists
175 .newArrayList();
176 final List<Object> differentlyOverriddenAnnotatedInSubclassGoodEvents = Lists.newArrayList();
177
178 @Override
179 public void overriddenNotAnnotatedInSubclass(Object o) {
180 super.overriddenNotAnnotatedInSubclass(o);
181 }
182
183 @Subscribe
184 @Override
185 public void overriddenAndAnnotatedInSubclass(Object o) {
186 super.overriddenAndAnnotatedInSubclass(o);
187 }
188
189 @Override
190 public void differentlyOverriddenNotAnnotatedInSubclass(Object o) {
191 differentlyOverriddenNotAnnotatedInSubclassGoodEvents.add(o);
192 }
193
194 @Subscribe
195 @Override
196 public void differentlyOverriddenAnnotatedInSubclass(Object o) {
197 differentlyOverriddenAnnotatedInSubclassGoodEvents.add(o);
198 }
199 }
200
201 public void testNotOverriddenInSubclass() {
202 assertThat(getSubscriber().notOverriddenInSubclassEvents).has().item(EVENT);
203 }
204
205 public void testOverriddenNotAnnotatedInSubclass() {
206 assertThat(getSubscriber().overriddenNotAnnotatedInSubclassEvents).has().item(EVENT);
207 }
208
209 public void testDifferentlyOverriddenNotAnnotatedInSubclass() {
210 assertThat(getSubscriber().differentlyOverriddenNotAnnotatedInSubclassGoodEvents)
211 .has().item(EVENT);
212 assertThat(getSubscriber().differentlyOverriddenNotAnnotatedInSubclassBadEvents).isEmpty();
213 }
214
215 public void testOverriddenAndAnnotatedInSubclass() {
216 assertThat(getSubscriber().overriddenAndAnnotatedInSubclassEvents).has().item(EVENT);
217 }
218
219 public void testDifferentlyOverriddenAndAnnotatedInSubclass() {
220 assertThat(getSubscriber().differentlyOverriddenAnnotatedInSubclassGoodEvents)
221 .has().item(EVENT);
222 assertThat(getSubscriber().differentlyOverriddenAnnotatedInSubclassBadEvents).isEmpty();
223 }
224
225 @Override
226 SubClass createSubscriber() {
227 return new SubClass();
228 }
229 }
230
231 public static class AbstractNotAnnotatedInSuperclassTest extends
232 AbstractEventBusTest<AbstractNotAnnotatedInSuperclassTest.SubClass> {
233 abstract static class SuperClass {
234 public abstract void overriddenInSubclassNowhereAnnotated(Object o);
235
236 public abstract void overriddenAndAnnotatedInSubclass(Object o);
237 }
238
239 static class SubClass extends SuperClass {
240 final List<Object> overriddenInSubclassNowhereAnnotatedEvents = Lists.newArrayList();
241 final List<Object> overriddenAndAnnotatedInSubclassEvents = Lists.newArrayList();
242
243 @Override
244 public void overriddenInSubclassNowhereAnnotated(Object o) {
245 overriddenInSubclassNowhereAnnotatedEvents.add(o);
246 }
247
248 @Subscribe
249 @Override
250 public void overriddenAndAnnotatedInSubclass(Object o) {
251 overriddenAndAnnotatedInSubclassEvents.add(o);
252 }
253 }
254
255 public void testOverriddenAndAnnotatedInSubclass() {
256 assertThat(getSubscriber().overriddenAndAnnotatedInSubclassEvents).has().item(EVENT);
257 }
258
259 public void testOverriddenInSubclassNowhereAnnotated() {
260 assertThat(getSubscriber().overriddenInSubclassNowhereAnnotatedEvents).isEmpty();
261 }
262
263 @Override
264 SubClass createSubscriber() {
265 return new SubClass();
266 }
267 }
268
269 public static class NeitherAbstractNorAnnotatedInSuperclassTest extends
270 AbstractEventBusTest<NeitherAbstractNorAnnotatedInSuperclassTest.SubClass> {
271 static class SuperClass {
272 final List<Object> neitherOverriddenNorAnnotatedEvents = Lists.newArrayList();
273 final List<Object> overriddenInSubclassNowhereAnnotatedEvents = Lists.newArrayList();
274 final List<Object> overriddenAndAnnotatedInSubclassEvents = Lists.newArrayList();
275
276 public void neitherOverriddenNorAnnotated(Object o) {
277 neitherOverriddenNorAnnotatedEvents.add(o);
278 }
279
280 public void overriddenInSubclassNowhereAnnotated(Object o) {
281 overriddenInSubclassNowhereAnnotatedEvents.add(o);
282 }
283
284 public void overriddenAndAnnotatedInSubclass(Object o) {
285 overriddenAndAnnotatedInSubclassEvents.add(o);
286 }
287 }
288
289 static class SubClass extends SuperClass {
290 @Override
291 public void overriddenInSubclassNowhereAnnotated(Object o) {
292 super.overriddenInSubclassNowhereAnnotated(o);
293 }
294
295 @Subscribe
296 @Override
297 public void overriddenAndAnnotatedInSubclass(Object o) {
298 super.overriddenAndAnnotatedInSubclass(o);
299 }
300 }
301
302 public void testNeitherOverriddenNorAnnotated() {
303 assertThat(getSubscriber().neitherOverriddenNorAnnotatedEvents).isEmpty();
304 }
305
306 public void testOverriddenInSubclassNowhereAnnotated() {
307 assertThat(getSubscriber().overriddenInSubclassNowhereAnnotatedEvents).isEmpty();
308 }
309
310 public void testOverriddenAndAnnotatedInSubclass() {
311 assertThat(getSubscriber().overriddenAndAnnotatedInSubclassEvents).has().item(EVENT);
312 }
313
314 @Override
315 SubClass createSubscriber() {
316 return new SubClass();
317 }
318 }
319
320 public static class DeepInterfaceTest extends
321 AbstractEventBusTest<DeepInterfaceTest.SubscriberClass> {
322 interface Interface1 {
323 @Subscribe
324 void annotatedIn1(Object o);
325
326 @Subscribe
327 void annotatedIn1And2(Object o);
328
329 @Subscribe
330 void annotatedIn1And2AndClass(Object o);
331
332 void declaredIn1AnnotatedIn2(Object o);
333
334 void declaredIn1AnnotatedInClass(Object o);
335
336 void nowhereAnnotated(Object o);
337 }
338
339 interface Interface2 extends Interface1 {
340 @Override
341 @Subscribe
342 void declaredIn1AnnotatedIn2(Object o);
343
344 @Override
345 @Subscribe
346 void annotatedIn1And2(Object o);
347
348 @Override
349 @Subscribe
350 void annotatedIn1And2AndClass(Object o);
351
352 void declaredIn2AnnotatedInClass(Object o);
353
354 @Subscribe
355 void annotatedIn2(Object o);
356 }
357
358 static class SubscriberClass implements Interface2 {
359 final List<Object> annotatedIn1Events = Lists.newArrayList();
360 final List<Object> annotatedIn1And2Events = Lists.newArrayList();
361 final List<Object> annotatedIn1And2AndClassEvents = Lists.newArrayList();
362 final List<Object> declaredIn1AnnotatedIn2Events = Lists.newArrayList();
363 final List<Object> declaredIn1AnnotatedInClassEvents = Lists.newArrayList();
364 final List<Object> declaredIn2AnnotatedInClassEvents = Lists.newArrayList();
365 final List<Object> annotatedIn2Events = Lists.newArrayList();
366 final List<Object> nowhereAnnotatedEvents = Lists.newArrayList();
367
368 @Override
369 public void annotatedIn1(Object o) {
370 annotatedIn1Events.add(o);
371 }
372
373 @Subscribe
374 @Override
375 public void declaredIn1AnnotatedInClass(Object o) {
376 declaredIn1AnnotatedInClassEvents.add(o);
377 }
378
379 @Override
380 public void declaredIn1AnnotatedIn2(Object o) {
381 declaredIn1AnnotatedIn2Events.add(o);
382 }
383
384 @Override
385 public void annotatedIn1And2(Object o) {
386 annotatedIn1And2Events.add(o);
387 }
388
389 @Subscribe
390 @Override
391 public void annotatedIn1And2AndClass(Object o) {
392 annotatedIn1And2AndClassEvents.add(o);
393 }
394
395 @Subscribe
396 @Override
397 public void declaredIn2AnnotatedInClass(Object o) {
398 declaredIn2AnnotatedInClassEvents.add(o);
399 }
400
401 @Override
402 public void annotatedIn2(Object o) {
403 annotatedIn2Events.add(o);
404 }
405
406 @Override
407 public void nowhereAnnotated(Object o) {
408 nowhereAnnotatedEvents.add(o);
409 }
410 }
411
412 public void testAnnotatedIn1() {
413 assertThat(getSubscriber().annotatedIn1Events).has().item(EVENT);
414 }
415
416 public void testAnnotatedIn2() {
417 assertThat(getSubscriber().annotatedIn2Events).has().item(EVENT);
418 }
419
420 public void testAnnotatedIn1And2() {
421 assertThat(getSubscriber().annotatedIn1And2Events).has().item(EVENT);
422 }
423
424 public void testAnnotatedIn1And2AndClass() {
425 assertThat(getSubscriber().annotatedIn1And2AndClassEvents).has().item(EVENT);
426 }
427
428 public void testDeclaredIn1AnnotatedIn2() {
429 assertThat(getSubscriber().declaredIn1AnnotatedIn2Events).has().item(EVENT);
430 }
431
432 public void testDeclaredIn1AnnotatedInClass() {
433 assertThat(getSubscriber().declaredIn1AnnotatedInClassEvents).has().item(EVENT);
434 }
435
436 public void testDeclaredIn2AnnotatedInClass() {
437 assertThat(getSubscriber().declaredIn2AnnotatedInClassEvents).has().item(EVENT);
438 }
439
440 public void testNowhereAnnotated() {
441 assertThat(getSubscriber().nowhereAnnotatedEvents).isEmpty();
442 }
443
444 @Override
445 SubscriberClass createSubscriber() {
446 return new SubscriberClass();
447 }
448 }
449 }